# -*- coding:utf-8 -*-
# @Desc : 
# @Author : Administrator
# @Date : 2019-07-03 10:46

## 模块(Module): 模块就是一个以.py结尾的文件
# 模块中可以定义变量,函数,类以及可执行的代码
# 模块编译后的文件(.pyc): 模块名.py 编译 模块名.pyc 解释执行 Python3


## 模块的导入方式:
# import 模块名  # 模块名.功能名()
# import 模块名 as 别名
# from 模块名 import *  # 将某模块的所有属性(功能)都导入到当前模块,不推荐使用
# 注: 当使用 from 模块名 import * 导入时,以"_"开头的隐藏属性不会被导入
# 注: 当使用 from 模块名 import * 导入时,只导入__all__列表内的属性
# from 模块名 import 功能名
# from 模块名 import 功能名 as 别名
# from 模块名 import 功能名1, 功能名2


## 模块的加载过程:
# 1.模块在导入时,模块内的所有语句会执行一遍
# 2.如果一个模块已经已导入,则再次导入时不会重新执行该模块内的语句


### 模块的内置属性与函数:
## dir([args])函数: 返回一个字符串列表
# 1.没有参数调用,返回当前模块的的变量、方法和定义的类型列表
# 2.有参数(模块)调用,返回该模块的所有属性的字符串列表
# 3.有参数(对象)调用,返回该对象的所有属性及类对象的所有属性的字符串列表
# 4.有参数(类名)调用,返回类对象的所有属性的字符串列表
## __doc__属性: 用来绑定模块的文档字符串(模块内第一行没有赋值给任何变量的字符串为模块的文档字符串)
## __name__属性: 记录模块的自身名字,用来判断是否为主模块(最先运行的模块)
# 1.当此模块为主模块时,__name__ 属性值绑定 '__main__'
# 2.当此模块不是主模块时,__name__ 属性值绑定 模块名
## __file__属性: 绑定模块对应的文档路径名
# 1.对于内建模块,不绑定路径(没有__file__属性)
# 2.对于其它模块,绑定文档路径名的字符串
## __all__属性: 用来存放可导出模块的属性字符串列表,控制 "from 模块名 import *" 的导出范围
# 如: __all__ = ['func1','func3','var2','var3']
# 注: 当使用 "from 模块名 import *" 导入时,只导入__all__列表内的元素


## 模块的定位顺序: 当导入模块时,Python解释器对模块位置的搜索顺序
# 1.首先搜索当前目录(搜索程序运行时的路径)
# 2.如果不在当前目录,Python解释器则搜索在shell变量PYTHONPATH下的每个目录(Python安装目录)
# 注: sys.path是存储模块搜索路径的列表;sys.path.append("自定义模块路径") 或 sys.path.insert(0,自定义模块路径)
# 3.如果都找不到,Python解释器则查看默认路径(UNIX下,默认路径一般为/usr/local/lib/python)


## 注: 当自定义模块名与已有模块名重名,则导致模块功能无法使用
## 注: 使用from 模块名 import 功能名时,如果功能名重复,则调用的是最后定义或导入的功能名


# 模块的分类:
# 1.内置模块,在解析器的内部可以直接使用              ---> len, max, min, ...
# 2.标准库模块,安装Python时已安装且可直接使用        ---> .py
# 3.第三方模块,需要自己手动安装                     ---> pip install 模块名
# 4.用户自己完成的模块(可以作为其它人的第三方模块)     ---> 自定义.py


## 模块导入和执行的过程:
# 1.先搜索相关的路径找模块(.py)
# 2.判断是否有此模块对应的.pyc文件，如果存在pyc文件且比.py文件新，则直接加载.pyc文件
# 3.否则用.py文件生成.pyc后再进行加载


######################################################################################################

## 包的制作与导入:
# 包: 将有联系的模块组织在一起,放在一个文件夹下,并且这个文件夹有一个"__init__.py"的文件
# 注: __init__.py文件控制着包的导入行为
# 注: __init__.py: 包内必须存在的文件,包加载时会被自动调用
# 注: 包的加载路径顺序与模块的加载路径熟顺序一致

## 包示例如下:
# mypackage/
#     __init__.py
#     menu.py
#     games/
#         __init__.py
#         contra.py
#         supermario.py
#         tanks.py
#     office/
#         __init__.py
#         excel.py
#         word.py


## 包的导入方式:
# import 包名.模块名                        如: 包名.模块名.功能名()
# from 包名 import 模块名                   如: 模块名.功能名()
# from 包名 import 模块名 as 别名            如: 别名.功能名()
# from 包名.模块名 import 功能名             如: 功能名()
# from 包名.模块名 import 功能名 as 别名      如: 别名()
# from 包名 import *                       如: 模块名.功能名()
# 注: 必须在__init__.py文件中添加__all__ = ["模块名"],控制允许导入的模块列表


